home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-12-16 | 6.5 KB | 245 lines | [TEXT/PJMM] |
- unit QAlerts;
-
- (* # Copyright Department of Computer Science *)
- (* # University of Western Australia *)
- (* # Created : Quinn *)
- (* # Station : Eriodon *)
- (* # Date : Thursday, 16 December 1993 *)
-
- interface
-
- procedure QParamText (p0, p1, p2, p3: Str255);
-
- (* These are all procedures because they happen async and you can't get the button back. *)
- (* You could always do some extreme hackery with the filter proc! *)
-
- procedure QAlert (id: integer; filter: ModalFilterProcPtr);
- procedure QNoteAlert (id: integer; filter: ModalFilterProcPtr);
- procedure QCautionAlert (id: integer; filter: ModalFilterProcPtr);
- procedure QStopAlert (id: integer; filter: ModalFilterProcPtr);
-
- procedure QAlertIdle (in_foreground: boolean);
-
- function InitQAlerts (icon_id: integer; icon_ndx: integer; sound: Handle; str: Str255): OSErr;
- procedure TermQAlerts;
-
- implementation
-
- uses
- Notification;
-
- type
- smallIcon = packed array[0..31] of byte;
- smallIconArray = array[1..1000] of smallIcon;
- smallIconPtr = ^smallIconArray;
- smallIconHandle = ^smallIconPtr;
-
- type
- alertKind = (aAlert, aNote, aCaution, aStop);
- alertHandle = ^alertPtr;
- alertPtr = ^alertRecord;
- alertRecord = record
- kind: alertKind;
- id: integer;
- filter: ModalFilterProcPtr;
- params: array[0..3] of StringHandle;
- next: alertHandle;
- end;
-
- var
- note: NMRec;
- my_icon: Handle;
- my_sound: Handle;
- my_string: Str255;
- current_params: array[0..3] of StringHandle;
- alerts: alertHandle;
-
- procedure QParamText (p0, p1, p2, p3: Str255);
- begin
- SetString(current_params[0], p0);
- SetString(current_params[1], p1);
- SetString(current_params[2], p2);
- SetString(current_params[3], p3);
- end; (* QParamText *)
-
- procedure InternalAlert (kind: alertKind; id: integer; filter: ModalFilterProcPtr);
- var
- err: OSErr;
- this_alert: alertHandle;
- i: integer;
- tmpstrh: StringHandle;
- tmp: alertHandle;
- begin
- (* create the alertRecord *)
- err := noErr;
- this_alert := alertHandle(NewHandleClear(sizeof(alertRecord))); (* Clear is important because it sets the params to nil *)
- if this_alert = nil then begin
- err := MemError;
- end; (* if *)
- (* and its strings *)
- for i := 0 to 3 do begin
- if err = noErr then begin
- tmpstrh := current_params[i];
- err := HandToHand(Handle(tmpstrh));
- if err = noErr then begin
- this_alert^^.params[i] := tmpstrh;
- end; (* if *)
- end; (* if *)
- end; (* for *)
- if err = noErr then begin
- (* now fill in other stuff *)
- this_alert^^.kind := kind;
- this_alert^^.id := id;
- this_alert^^.filter := filter;
- this_alert^^.next := nil;
-
- if alerts = nil then begin
- (* first alert, add it to the list (easy) then install the note *)
- alerts := this_alert;
- with note do begin (* safe *)
- qType := nmType;
- nmMark := 1; (* mark current application in Apple menu *)
- nmIcon := my_icon;
- nmSound := my_sound;
- if my_string = '' then begin
- nmStr := nil;
- end
- else begin
- nmStr := @my_string;
- end; (* if *)
- nmResp := nil;
- nmRefCon := 0;
- end; (* with *)
- err := NMInstall(@note);
- end
- else begin
- (* subsequent alerts, add it to END of list *)
- tmp := alerts;
- while tmp^^.next <> nil do begin
- tmp := tmp^^.next;
- end; (* while *)
- tmp^^.next := this_alert;
- end; (* if *)
- end
- else begin
- (* tidy up *)
- if this_alert <> nil then begin
- for i := 0 to 3 do begin
- if this_alert^^.params[i] <> nil then begin
- DisposeHandle(Handle(this_alert^^.params[i]));
- end; (* if *)
- end; (* for *)
- DisposeHandle(Handle(this_alert));
- end; (* if *)
- end; (* if *)
- end; (* InternalAlert *)
-
- procedure QAlert (id: integer; filter: ModalFilterProcPtr);
- begin
- InternalAlert(aAlert, id, filter);
- end; (* QParamText *)
-
- procedure QNoteAlert (id: integer; filter: ModalFilterProcPtr);
- begin
- InternalAlert(aNote, id, filter);
- end; (* QParamText *)
-
- procedure QCautionAlert (id: integer; filter: ModalFilterProcPtr);
- begin
- InternalAlert(aCaution, id, filter);
- end; (* QParamText *)
-
- procedure QStopAlert (id: integer; filter: ModalFilterProcPtr);
- begin
- InternalAlert(aStop, id, filter);
- end; (* QParamText *)
-
- procedure QAlertIdle (in_foreground: boolean);
- var
- this_alert: alertHandle;
- i: integer;
- junk: integer;
- begin
- if in_foreground then begin
- while alerts <> nil do begin
- this_alert := alerts;
- alerts := alerts^^.next;
-
- HLock(Handle(this_alert));
- with this_alert^^ do begin (* unsafe, checked (this_alert locked)*)
- for i := 0 to 3 do begin
- HLock(Handle(params[i]));
- end; (* for *)
- (* individual params are locked so we can pass them dereferenced *)
- ParamText(params[0]^^, params[1]^^, params[2]^^, params[3]^^);
- for i := 0 to 3 do begin
- DisposeHandle(Handle(params[i]));
- params[i] := nil;
- end; (* for *)
-
- case kind of
- aAlert:
- junk := Alert(id, filter);
- aNote:
- junk := NoteAlert(id, filter);
- aCaution:
- junk := CautionAlert(id, filter);
- aStop:
- junk := StopAlert(id, filter);
- end; (* case *)
-
- end; (* with *)
- DisposeHandle(Handle(this_alert));
- end; (* if *)
- junk := NMRemove(@note);
- end; (* if *)
- end; (* QAlertIdle *)
-
- function InitQAlerts (icon_id: integer; icon_ndx: integer; sound: Handle; str: Str255): OSErr;
- var
- err: OSErr;
- i: integer;
- s: signedByte;
- icons: smallIconHandle;
- begin
- my_sound := sound;
- my_string := str;
- my_icon := nil;
- alerts := nil;
- err := noErr;
- for i := 0 to 3 do begin
- current_params[i] := NewString('');
- if current_params[i] = nil then begin
- err := memFullErr;
- end; (* if *)
- end; (* for *)
- if err = noErr then begin
- icons := smallIconHandle(GetResource('SICN', icon_id));
- err := ResError;
- if (icons = nil) and (err = noErr) then begin
- err := resNotFound;
- end; (* if *)
- end; (* if *)
- if err = noErr then begin
- s := HGetState(Handle(icons));
- HLock(Handle(icons));
- err := PtrToHand(@icons^^[icon_ndx], my_icon, sizeof(smallIcon));
- HSetState(Handle(icons), s);
- end; (* if *)
- InitQAlerts := err;
- end; (* InitQAlerts *)
-
- procedure TermQAlerts;
- var
- junk: OSErr;
- begin
- if alerts <> nil then begin
- junk := NMRemove(@note);
- alerts := nil; (* make sure we *never* try to remove it again *)
- end; (* if *)
- (* I'm not going to bother dispose all of the memory. *)
- (* Basically you have to walk the alerts list doing the deed. *)
- (* Seeing as the app is about to terminate it's just a waste of code. *)
- end; (* TermQAlerts *)
-
- end.